/*
给定一个括号序列，要求尽可能少地添加若干括号使得括号序列变得合法，当添加完成后，会产生不同的添加结果，请问有多少种本质不同的添加结果。

两个结果是本质不同的是指存在某个位置一个结果是左括号，而另一个是右括号。

例如，对于括号序列 ((()，只需要添加两个括号就能让其合法，有以下几种不同的添加结果：()()()、()(())、(())()、(()()) 和 ((()))。

输入格式
输入一行包含一个字符串 s，表示给定的括号序列，序列中只有左括号和右括号。

输出格式
输出一个整数表示答案，答案可能很大，请输出答案除以 1000000007 (即 109+7) 的余数。

数据范围
对于 40% 的评测用例，|s|≤200。
对于所有评测用例，1≤|s|≤5000。

输入样例：
((()
输出样例：
5
*/
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

typedef long long LL;

const int N = 5010, MOD = 1e9 + 7;

LL f[N][N];
char s[N];
int cnt, n;
LL work()
{
    memset(f, 0, sizeof f);
    f[0][0] = 1;
    for (int i = 1; i <= n; i++)
    {
        if (s[i] == '(')
            for (int j = 1; j <= n; j++)
                f[i][j] = f[i - 1][j - 1];
        else
        {
            f[i][0] = (f[i - 1][0] + f[i - 1][1]) % MOD;
            for (int j = 1; j <= n; j++)
                f[i][j] = (f[i - 1][j + 1] + f[i][j - 1]) % MOD;
        }
    }
    for (int i = 0; i <= n; i++)
        if (f[n][i])
            return f[n][i];
    return -1;
}
int main(int argc, char const *argv[])
{
    cin >> s + 1;
    n = strlen(s + 1);
    LL l = work();
    reverse(s + 1, s + 1 + n);
    for (int i = 1; i < n + 1; i++)
        if (s[i] == '(')
            s[i] = ')';
        else
            s[i] = '(';
    LL r = work();
    cout << r * l % MOD << endl;

    return 0;
}